home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / lboss01.lzh / enemy.c next >
C/C++ Source or Header  |  1999-04-22  |  10KB  |  489 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <XSP2lib.H>
  5. #include "main.h"
  6. #include "enemy.h"
  7. #include "fxsp2lib.h"
  8. #include "parts.h"
  9.  
  10. #define ENEMY_MAX    256    /* 最大数 */
  11.  
  12.  
  13. #define P1_K    0.5        /* ばね定数(左右大パーツ) */
  14. #define P1_M    0.2        /* 摩擦計数(左右大パーツ) */
  15. #define P1_V    0.5        /* 速度がこれ以下なら次へ(左右大パーツ) */
  16. #define P1_L    0.4        /* 座標がこれ以下なら次へ(左右大パーツ) */
  17.  
  18. #define P2_K    2.9        /* ばね定数(左右上小パーツ) */
  19. #define P2_M    0.06        /* 摩擦計数(左右上小パーツ) */
  20. #define P2_V    0.1        /* 速度がこれ以下なら次へ(左右上小パーツ) */
  21. #define P2_L    0.1        /* 座標がこれ以下なら次へ(左右上小パーツ) */
  22. #define P2_S    22        /* seq_counter がこれになったら動作開始(左右上小パーツ) */
  23.  
  24. #define P3_K    1.5        /* ばね定数(左右下小パーツ) */
  25. #define P3_M    0.06        /* 摩擦計数(左右下小パーツ) */
  26. #define P3_V    0.1        /* 速度がこれ以下なら次へ(左右下小パーツ) */
  27. #define P3_L    0.1        /* 座標がこれ以下なら次へ(左右下小パーツ) */
  28. #define P3_S    40        /* seq_counter がこれになったら動作開始(左右下小パーツ) */
  29.  
  30.  
  31. static ENEMY *enemy_top,    /* 使用中のワークのリスト */
  32.  *enemy_null_top,        /* 空のワークのリスト */
  33.  *enemy_end;            /* 使用中ワークのリストの末尾 */
  34.  
  35. static ENEMY enemy[ENEMY_MAX];    /* ワーク */
  36.  
  37. extern char end_of_data;
  38.  
  39. typedef struct _spwork {
  40.     signed short x, y;    /* 座標 */
  41.     unsigned short pt;    /* スプライトパターンNo. */
  42.     unsigned short info;    /* 反転コード・色・優先度を表わすデータ */
  43. } SPWORK;
  44.  
  45.  
  46. SPWORK spwork;
  47.  
  48.  
  49.  
  50. int EnemyInit0 (void)
  51. {
  52.     int i;
  53.  
  54.     /* リストをつなげる */
  55.     enemy_top = NULL;
  56.     enemy_end = NULL;
  57.     enemy_null_top = enemy;
  58.     for (i = 0; i < ENEMY_MAX; i++)
  59.         enemy[i].next = &enemy[i + 1];
  60.  
  61.     enemy[ENEMY_MAX - 1].next = NULL;
  62.  
  63.     return (0);
  64. }
  65.  
  66.  
  67.  
  68. void EnemyInit (unsigned short type, unsigned short info,
  69.         signed short ox, signed short oy, ENEMY * parent)
  70. {
  71.     ENEMY *p;
  72.  
  73.     if (enemy_null_top == NULL) {
  74.         printf ("ワークが一杯です\n");
  75.         return;        /* 空きのワークがない(キャラクターオーバー) */
  76.     }
  77.     /* リストの末尾に新しいノードを追加 */
  78.     p = enemy_null_top;
  79.     enemy_null_top = p->next;
  80.     if (enemy_top == NULL)
  81.         enemy_top = p;
  82.     else
  83.         enemy_end->next = p;
  84.     p->next = NULL;
  85.     enemy_end = p;
  86.  
  87.     p->type = type;
  88.     p->info = info;
  89.     p->ox = ox;
  90.     p->oy = oy;
  91.     p->x = 0;
  92.     p->y = 0;
  93.     p->parent = parent;
  94.  
  95.     p->lx = 0.0;
  96.     p->ly = 0.0;
  97.     p->lz = 0.0;
  98.     p->vx = 0.0;
  99.     p->vy = 0.0;
  100.     p->vz = 0.0;
  101.     p->cyc = 0;
  102.     p->cyc1 = 0;
  103.  
  104.     switch (p->type) {
  105.     case 0:        /* 本体 */
  106.         EnemyInit (1, 0x0432, -48, 16, p);    /* 左大パーツ */
  107.         EnemyInit (2, 0x0432, 32, 16, p);    /* 右大パーツ */
  108.         EnemyInit (3, 0x043a, -32, 0, p);    /* 左上小パーツ */
  109.         EnemyInit (4, 0x043a, 32, 0, p);    /* 右上小パーツ */
  110.         break;
  111.     case 1:        /* 左大パーツ */
  112.         EnemyInit (5, 0x043a, 16, 16, p);    /* 左下小パーツ */
  113.         break;
  114.     case 2:        /* 右大パーツ */
  115.         EnemyInit (6, 0x043a, -16, 16, p);    /* 右下小パーツ */
  116.         break;
  117.     case 3:        /* 左上小パーツ */
  118.         break;
  119.     case 4:        /* 右上小パーツ */
  120.         break;
  121.     case 5:        /* 左下小パーツ */
  122.         break;
  123.     case 6:        /* 右下小パーツ */
  124.         break;
  125.     case 7:        /* 中央パーツ */
  126.         break;
  127.     default:
  128.         printf ("enemy_move() : バグってます\n");
  129.         break;
  130.     }
  131. }
  132.  
  133.  
  134. /* 複数のスプライトで構成されているパーツ1個分のスプライトをまとめて表示 */
  135. static void DispSp (ENEMY * p, short sp_num, PARTS_TABLE * parts_table)
  136. {
  137.     short h;
  138.  
  139.     for (h = 0; h < sp_num; h++) {
  140.         p->x = p->lx + p->ox;
  141.         p->y = p->ly + p->oy;
  142.         if (p->parent != NULL) {
  143.             spwork.x = p->x + p->parent->x + parts_table[h].x;
  144.             spwork.y = p->y + p->parent->y + parts_table[h].y;
  145.         } else {
  146.             spwork.x = p->x + parts_table[h].x;
  147.             spwork.y = p->y + parts_table[h].y;
  148.         }
  149.         spwork.pt = parts_table[h].pt;
  150.         spwork.info = p->info;
  151.  
  152.         spwork.x += (128 + 16);    /* 表示用に補正 */
  153.         spwork.y += (128 + 16);
  154.         xsp_set_st (&spwork);
  155.         fxsp_set_st (&spwork);
  156.         spwork.x -= (128 + 16);
  157.         spwork.y -= (128 + 16);
  158.     }
  159. }
  160.  
  161.  
  162.  
  163. void EnemyMove (void)
  164. {
  165.     ENEMY *p, *q;
  166.  
  167.     p = enemy_top;
  168.     q = NULL;
  169.     while (p != NULL) {
  170.         char erase_flag = 0;
  171.  
  172.         switch (p->type) {
  173.         case 0:    /* 本体 */
  174.             DispSp (p, 36, parts0_table);
  175.             break;
  176.         case 1:    /* 左大パーツ */
  177.             switch (p->cyc) {
  178.             case 0:
  179.                 if (seq_counter == 2)
  180.                     p->cyc = 1;
  181.                 break;
  182.             case 1:/* 加速度的に離れる */
  183.                 if (p->vx > -3.0)
  184.                     p->vx -= 0.5;
  185.                 p->lx += p->vx;
  186.                 if (p->lx < -8.0) {
  187.                     p->cyc++;    /* 次へ */
  188.                     p->lx = -8.0;
  189.                     p->ox += p->lx;
  190.                     p->oy += p->ly;
  191.                     p->lx = 0.0;    /* 今度はここが原点になる */
  192.                     p->ly = 0.0;
  193.                 }
  194.                 break;
  195.             case 2:/* ばね振動 */
  196.                 p->vx -= p->lx * P1_K;
  197.                 /* 摩擦 */
  198.                 if (p->vx > 0)
  199.                     p->vx -= P1_M;
  200.                 else
  201.                     p->vx += P1_M;
  202.                 p->lx += p->vx;
  203.                 if ((fabs (p->vx) < P1_V) && (fabs (p->lx) < P1_L)) {
  204.                     p->cyc++;    /* 次へ */
  205.                     p->lx = 0.0;
  206.                     p->ly = 0.0;
  207.                     p->vx = 0.0;
  208.                     p->vy = 0.0;
  209.                 }
  210.                 break;
  211.             default:
  212.                 break;
  213.             }
  214.             DispSp (p, 25, parts1_table);
  215.             break;
  216.         case 2:    /* 右大パーツ */
  217.             switch (p->cyc) {
  218.             case 0:
  219.                 if (seq_counter == 2)
  220.                     p->cyc = 1;
  221.                 break;
  222.             case 1:/* 加速度的に離れる */
  223.                 if (p->vx < 3.0)
  224.                     p->vx += 0.5;
  225.                 p->lx += p->vx;
  226.                 if (p->lx > 8.0) {
  227.                     p->cyc++;    /* 次へ */
  228.                     p->lx = 8.0;
  229.                     p->ox += p->lx;
  230.                     p->oy += p->ly;
  231.                     p->lx = 0.0;    /* 今度はここが原点になる */
  232.                     p->ly = 0.0;
  233.                 }
  234.                 break;
  235.             case 2:/* ばね振動 */
  236.                 p->vx -= p->lx * P1_K;
  237.                 /* 摩擦 */
  238.                 if (p->vx > 0)
  239.                     p->vx -= P1_M;
  240.                 else
  241.                     p->vx += P1_M;
  242.                 p->lx += p->vx;
  243.                 if ((fabs (p->vx) < P1_V) && (fabs (p->lx) < P1_L)) {
  244.                     p->cyc++;    /* 次へ */
  245.                     p->lx = 0.0;
  246.                     p->ly = 0.0;
  247.                     p->vx = 0.0;
  248.                     p->vy = 0.0;
  249.                 }
  250.                 break;
  251.             default:
  252.                 break;
  253.             }
  254.             DispSp (p, 25, parts2_table);
  255.             break;
  256.         case 3:    /* 左上小パーツ */
  257.             switch (p->cyc) {
  258.             case 0:
  259.                 if (seq_counter > P2_S) {
  260.                     p->cyc++;    /* 次へ */
  261.                     p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  262.                     p->vz = 0.0;
  263.                 }
  264.                 break;
  265.             case 1:/* 加速度的に離れる */
  266.                 if (p->vz < 0.20)
  267.                     p->vz += 0.10;
  268.                 p->lz += p->vz;
  269.                 p->lx = (301 - 305) * p->lz;
  270.                 p->ly = (125 - 140) * p->lz;
  271.                 if (p->lz > 1.0) {
  272.                     p->cyc++;    /* 次へ */
  273.                     p->lz = 0.0;
  274.                     p->lx = 0.0;    /* 今度はここが原点になる */
  275.                     p->ly = 0.0;
  276.                     p->ox += (301 - 305);
  277.                     p->oy += (125 - 140);
  278.                 }
  279.                 break;
  280.             case 2:/* ばね振動 */
  281.                 p->vz -= p->lz * P2_K;
  282.                 /* 摩擦 */
  283.                 if (p->vz > 0)
  284.                     p->vz -= P2_M;
  285.                 else
  286.                     p->vz += P2_M;
  287.                 p->lz += p->vz;
  288.                 p->lx = (301 - 305) * p->lz;
  289.                 p->ly = (125 - 140) * p->lz;
  290.                 if ((fabs (p->vz) < P2_V) && (fabs (p->lz) < P2_L)) {
  291.                     p->cyc++;    /* 次へ */
  292.                     p->lx = 0.0;
  293.                     p->ly = 0.0;
  294.                     p->vx = 0.0;
  295.                     p->vy = 0.0;
  296.                 }
  297.                 break;
  298.             default:
  299.                 break;
  300.             }
  301.             DispSp (p, 9, parts3_table);
  302.             break;
  303.         case 4:    /* 右上小パーツ */
  304.             switch (p->cyc) {
  305.             case 0:
  306.                 if (seq_counter > P2_S) {
  307.                     p->cyc++;    /* 次へ */
  308.                     p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  309.                     p->vz = 0.0;
  310.                 }
  311.                 break;
  312.             case 1:/* 加速度的に離れる */
  313.                 if (p->vz < 0.20)
  314.                     p->vz += 0.10;
  315.                 p->lz += p->vz;
  316.                 p->lx = -(301 - 305) * p->lz;
  317.                 p->ly = (125 - 140) * p->lz;
  318.                 if (p->lz > 1.0) {
  319.                     p->cyc++;    /* 次へ */
  320.                     p->lz = 0.0;
  321.                     p->lx = 0.0;    /* 今度はここが原点になる */
  322.                     p->ly = 0.0;
  323.                     p->ox -= (301 - 305);
  324.                     p->oy = (125 - 140);
  325.                 }
  326.                 break;
  327.             case 2:/* ばね振動 */
  328.                 p->vz -= p->lz * P2_K;
  329.                 /* 摩擦 */
  330.                 if (p->vz > 0)
  331.                     p->vz -= P2_M;
  332.                 else
  333.                     p->vz += P2_M;
  334.                 p->lz += p->vz;
  335.                 p->lx = -(301 - 305) * p->lz;
  336.                 p->ly = (125 - 140) * p->lz;
  337.                 if ((fabs (p->vz) < P2_V) && (fabs (p->lz) < P2_L)) {
  338.                     p->cyc++;    /* 次へ */
  339.                     p->lx = 0.0;
  340.                     p->ly = 0.0;
  341.                     p->vx = 0.0;
  342.                     p->vy = 0.0;
  343.                 }
  344.                 break;
  345.             default:
  346.                 break;
  347.             }
  348.             DispSp (p, 9, parts4_table);
  349.             break;
  350.         case 5:    /* 左下小パーツ */
  351.             switch (p->cyc) {
  352.             case 0:
  353.                 if (seq_counter > P3_S) {
  354.                     p->cyc++;    /* 次へ */
  355.                     p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  356.                     p->vz = 0.0;
  357.                 }
  358.                 break;
  359.             case 1:/* 加速度的に離れる */
  360.                 if (p->vz < 0.20)
  361.                     p->vz += 0.10;
  362.                 p->lz += p->vz;
  363.                 p->lx = (301 - 320) * p->lz;
  364.                 p->ly = (184 - 179) * p->lz;
  365.                 if (p->lz > 1.0) {
  366.                     p->cyc++;    /* 次へ */
  367.                     p->lz = 0.0;
  368.                     p->lx = 0.0;    /* 今度はここが原点になる */
  369.                     p->ly = 0.0;
  370.                     p->ox += (301 - 320);
  371.                     p->oy += (184 - 179);
  372.                 }
  373.                 break;
  374.             case 2:/* ばね振動 */
  375.                 p->vz -= p->lz * P3_K;
  376.                 /* 摩擦 */
  377.                 if (p->vz > 0)
  378.                     p->vz -= P3_M;
  379.                 else
  380.                     p->vz += P3_M;
  381.                 p->lz += p->vz;
  382.                 p->lx = (301 - 320) * p->lz;
  383.                 p->ly = (184 - 179) * p->lz;
  384.                 if ((fabs (p->vz) < P3_V) && (fabs (p->lz) < P3_L)) {
  385.                     p->cyc++;    /* 次へ */
  386.                     p->lx = 0.0;
  387.                     p->ly = 0.0;
  388.                     p->vx = 0.0;
  389.                     p->vy = 0.0;
  390.                 }
  391.                 break;
  392.             default:
  393.                 break;
  394.             }
  395.             DispSp (p, 12, parts5_table);
  396.             break;
  397.         case 6:    /* 右下小パーツ */
  398.             switch (p->cyc) {
  399.             case 0:
  400.                 if (seq_counter > P3_S) {
  401.                     p->cyc++;    /* 次へ */
  402.                     p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  403.                     p->vz = 0.0;
  404.                 }
  405.                 break;
  406.             case 1:/* 加速度的に離れる */
  407.                 if (p->vz < 0.20)
  408.                     p->vz += 0.10;
  409.                 p->lz += p->vz;
  410.                 p->lx = -(301 - 320) * p->lz;
  411.                 p->ly = (184 - 179) * p->lz;
  412.                 if (p->lz > 1.0) {
  413.                     p->cyc++;    /* 次へ */
  414.                     p->lz = 0.0;
  415.                     p->lx = 0.0;    /* 今度はここが原点になる */
  416.                     p->ly = 0.0;
  417.                     p->ox -= (301 - 320);
  418.                     p->oy += (184 - 179);
  419.                 }
  420.                 break;
  421.             case 2:/* ばね振動 */
  422.                 p->vz -= p->lz * P3_K;
  423.                 /* 摩擦 */
  424.                 if (p->vz > 0)
  425.                     p->vz -= P3_M;
  426.                 else
  427.                     p->vz += P3_M;
  428.                 p->lz += p->vz;
  429.                 p->lx = -(301 - 320) * p->lz;
  430.                 p->ly = (184 - 179) * p->lz;
  431.                 if ((fabs (p->vz) < P3_V) && (fabs (p->lz) < P3_L)) {
  432.                     p->cyc++;    /* 次へ */
  433.                     p->lx = 0.0;
  434.                     p->ly = 0.0;
  435.                     p->vx = 0.0;
  436.                     p->vy = 0.0;
  437.                     end_of_data = !0;    /* 終わり */
  438.                 }
  439.                 break;
  440.             default:
  441.                 break;
  442.             }
  443.             DispSp (p, 12, parts6_table);
  444.             break;
  445.         case 7:    /* 中央パーツ */
  446.             if (seq_counter == 3)
  447.                 erase_flag = !0;
  448.             else
  449.                 DispSp (p, 12, parts7_table);
  450.             break;
  451.         default:
  452.             printf ("enemy_move() : バグってます\n");
  453.             break;
  454.         }
  455.  
  456.         if (erase_flag) {
  457.             if (q == NULL) {    /* リストの一番最初を削除 */
  458.                 enemy_top = p->next;
  459.                 p->next = enemy_null_top;
  460.                 enemy_null_top = p;
  461.                 q = NULL;
  462.                 p = enemy_top;
  463.             } else {
  464.                 q->next = p->next;
  465.                 p->next = enemy_null_top;
  466.                 enemy_null_top = p;
  467.                 p = q->next;
  468.             }
  469.         } else {
  470.             q = p;
  471.             p = p->next;
  472.         }
  473.     }
  474. }
  475.  
  476.  
  477. void EnemyTini (void)
  478. {
  479.     int i;
  480.  
  481.     /* リストをつなげる */
  482.     enemy_top = NULL;
  483.     enemy_null_top = enemy;
  484.     for (i = 0; i < ENEMY_MAX; i++)
  485.         enemy[i].next = &enemy[i + 1];
  486.  
  487.     enemy[ENEMY_MAX - 1].next = NULL;
  488. }
  489.